iT邦幫忙

2023 iThome 鐵人賽

DAY 6
0
自我挑戰組

Jr 前端工程師面試題目檢討賽系列 第 7

【2023 挑戰賽 Day8】我...我斷賽了 (還是有練一題 JS)

  • 分享至 

  • xImage
  •  

今天決定開頭完成 JS 題目後,後面再分享導致斷賽的意外事件 QQ,最後再分享對於過去這一周寫文章的感想。

JS 字串處理

一、題目描述

完成一個 JavaScript 函數 firstNonRepeatingLetter (str),它接受字串作為參數,並返回字串中最早出現且不重複的第一個字符。

例如,如果參數為 “stress”,函數應返回 “t”,因為字母 t 在字串中僅出現一次,且在字串中首先出現。

請注意,大寫和小寫字母被視為相同的字符,但該函數應返回該字符的正確大小寫。例如,輸入 “sTreSS” 應返回 “T”。

二、解題

function firstNonRepeatingLetter(str) {
  // 先將字串轉為小寫,以方便比較
  const lowerStr = str.toLowerCase();

  // 以字串的長度作為 for-loop 運行的次數
  for (let i = 0; i < str.length; i++) {
    // 如果該字符從前面往後找,跟從後面往前找都獲得一樣的索引值,代表這個字符是第一個不重複的字符
    // 以字串小寫化後的狀態做比較,如果找到重複的字符,返回轉換成小寫前的字符 
    if (lowerStr.indexOf(lowerStr[i]) === lowerStr.lastIndexOf(lowerStr[i])) {
      // 返回原始大小写的字符
      return str[i];
    }
  }

  // 如果完全不存在單一個的字符(代表每個字符都出現超過一次),則返回一個空的字串
  return "";
}

三、複習 JS 方法-indexOf(), lastIndexOf()

1. indexOf(searchElement[, fromIndex])

可以用來處理字串也可以處理陣列,如果傳入一個參數,則代表要尋找的字符/元素,如果傳入第二個參數,則代表開始往後尋找的索引位置。

indexOf()方法會從頭部開始找,如果找到了,回傳從頭部開始找到的該元素的索引值,如果都找不著,就會回傳 -1。

範例:

const str = 'Hello, World!';
console.log(str.indexOf('W')) // 7
console.log(str.indexOf('w'))  // -1 因為字串中沒有小寫 w

const family = ['Alice', 'Bob', 'Cindy', 'Dacy', 'Ella'];
console.log(family.indexOf('Bob')) // 1
console.log(family.indexOf('Bob', 2)console.log( // -1 因為從索引 2 往後找不到 'Bob'

2. lastIndexOf(searchElement[, fromIndex])

indexOf() 很像,但是找尋的順序是從尾部開始,所以如果一個字串/陣列中有重複的字符/元素,那就會回傳最接近的尾部、符合條件的元素索引值。

lastIndexOf() 的第二個參數比較需要腦筋急轉彎一下。參數二跟 indexOf() 一樣表示一個索引位置,不同的是,在 lastIndexOf() 所給予的參數二索引位置代表我們要哪一個位置開始「往前尋找」。如果找不到,一樣會返回 -1

範例:

const str = 'Everyone!';
console.log(str.lastIndexOf('e')) // 7 
console.log(str.lastIndexOf('e', 1)) // -1 因為索引位置 1 往前尋找只有 E 與 v 兩個字符,找不到 e

好了,今天的解題作業告一段落,讓我來分享開頭說的小意外是什麼吧~

/images/emoticon/emoticon02.gif

悲傷五階段

大家聽過悲傷五階段嗎?今天在我身上發生了一件熱騰騰的意外,容我用一種比較幽默的方式來分享。

精神科醫生庫伯勒.羅絲(Kübler-Ross)在 1969 年提出了「悲傷五階段」,是人們在遇到重大事件時會經歷的五個情緒的階段,包含否認、憤怒、討價還價、沮喪、接受。這五個階段並不是線性發生的,而是有可能會在某些階段反覆徘徊。

昨天完成了 Day7 的文章,今天我一早起來坐在電腦前,準備構思我的 Day8 文章,發現文章上頭跳出了一行字:

好可惜在第 6 天中斷比賽了,邀請您繼續寫完 30 篇鐵人文,讓讀者一睹此系列文章的完整樣貌。

我:?!?!

於是我與主辦團隊來回寫信確認、協商之後,結論就是,我在 Day7 發文時沒有選取到「鐵人賽發文」的類別,而被歸類在一般技術文章,所以視為中斷比賽,且無法給我復賽的機會。

將這個過程套用悲傷五階段的各種反應:

「否認」:為什麼會這樣?是系統的 bug 吧?
「憤怒」:我有乖乖每天連續發文,我只是沒按到正確的分類ㄚ~~~
「討價還價」:問主辦團隊真的沒有讓我復賽的可能性嗎?
「沮喪」:雖然我的流量很小,但也是對流量有點貢獻的吧......還是我轉到 Matters 發文好了,至少還有微薄的斗內......
「接受」:好吧,尊重主辦團隊,主辦團隊也很辛苦,相信做這個決定有他們的考量跟原因。

接受了這個結果後,我決定還是把 30 天的文章跑完。我的強者朋友安安說,既然我拿不到主辦單位給予的參賽獎狀,她可以幫我 V.I.P 製作一個完賽證明,還可以加上我喜歡的圖案。

/images/emoticon/emoticon02.gif 安安好感人!

希望每位有心參賽的朋友都不會遇到像我這樣的小意外,也祝福大家順利都完賽~QQ 我也會跟大家一起繼續跑完唷! like a 馬拉松比賽被淘汰但還是跟著一起跑完的選手

關於後面 22 天發文的規劃

今天本來有想要挑戰 JW、XSS、CSRF 等比較進階的主題,但今天看完資料後發現自己其實有點自不量力,尤其在每天都要發文的這種頻率下,對於一個觀念型的問題更要好好事前規劃,更沒辦法像 JS 解題一樣可以比較零散地處理。

所以整理到一半就決定,將自己沒把握的內容放回 notion 小筆記裡,用一個 JS 面試題取代。

依我這幾天試寫的感受下來,我發現自己還是喜歡在一篇公開文章用技術濃度偏低、速度偏慢的寫法,因為我知道自己不是很快就能夠把很多生硬的名詞吞下後馬上消化的人,而雖然是以寫給自己看的筆記為目的,還是希望內容都是自己比較有把握且整理過的,至少之後回頭看,也會是對自己來說舒服的閱讀節奏。

總之,我決定接下來 10 篇會以我前陣子面試經驗相關的主題來分享,對我來說比較輕鬆,也比較能夠好好安排時間讀一些複雜的內容。

後面那幾篇,如果不是分享一些我學到的新知識,就會分享自己開始工作的心得,繼續把這裡當作一個部落格的概念 XD (好隨興)

謝謝大家,我們明天見囉!


上一篇
【2023 挑戰賽 Day6】 #JS #面試經驗 字串操作
下一篇
【2023 挑戰賽 Day9】找工作囉!當自己的經紀人吧~(1)前言
系列文
Jr 前端工程師面試題目檢討賽14
圖片
  直播研討會
圖片
{{ item.channelVendor }} {{ item.webinarstarted }} |
{{ formatDate(item.duration) }}
直播中

1 則留言

0
ayugioh2003
iT邦新手 1 級 ‧ 2023-10-16 00:15:52

我 ... 去年也意外斷賽
因為睡過頭 orz
只好今年再重新挑戰一次 XD

哈哈!親自參賽才發現每天po真的超難~

我要留言

立即登入留言